Тема:
Мета:
ТЕОРЕТИЧНІ ВІДОМОСТІ
В даній лабораторній роботі, використовуючи графічні функції бібліотеки OpenGL, генерується досить складне зображення, яке є набором простих геометричних фігур, а саме – квадратів.
Отже дана фігура складається з шести квадратів, кожен з яких є комбінацією квадратів які обертаються навколо центра і зменшуються таким чином щоб кожен наступний квадрат “входив” у попередній. Поворот квадрата здійснюється за такими правилами – малюється лінія яка зміщена по кожній з координатних осей на N-ну кількість пік селів. Наприклад – нижня лінія : один кінець зсунутий по осі Х на n-ну кількість пік селів, другий – по осі У.
Розміри квадрата визначаються спеціальною функцією яка є підібраною для конкретного випадку.
Текст програми
program Bachinsky3;
uses
Messages, Windows, OpenGL;
const
AppName = 'Bachinsky-3';
Var
dop:integer;
Window : HWnd;
Message : TMsg;
WindowClass : TWndClass;
dc : HDC;
hrc : HGLRC; // контекст воспроизведения OpenGL
MyPaint : TPaintStruct;
centreX,centreY,LongLine,Coner: integer;
//--------------my------------------
procedure Paint(CentreX,CentreY,LongLine,Coner:integer);
var Delta,HalfLongLine,
X1,X2,X3,X4,Y1,Y2,Y3,Y4:integer;
begin
while Coner>0 do Coner:=Coner-90;
Coner:=Coner+90;
Delta:=(LongLine*Coner div 90);
HalfLongLine:=LongLine div 2;
X1:=CentreX-HalfLongLine;
Y1:=CentreY-HalfLongLine+Delta;
X2:=X1+Delta;
Y2:=CentreY+HalfLongLine;
X3:=CentreX+HalfLongLine;
Y3:=Y2-Delta;
X4:=X3-Delta;
Y4:=CentreY-HalfLongLine;
// glClear (GL_COLOR_BUFFER_BIT);
glEnable(GL_LINE_SMOOTH);
glColor3f (0.9,0.2,1.0);
glbegin(GL_LINES);
glVertex2f(x1/100,y1/100);
glVertex2f(x2/100,y2/100);
glVertex2f(x2/100,y2/100);
glVertex2f(x3/100,y3/100);
glVertex2f(x3/100,y3/100);
glVertex2f(x4/100,y4/100);
glVertex2f(x4/100,y4/100);
glVertex2f(x1/100,y1/100);
glend;
end;
//----------------------------------
// Процедура заполнения полей структуры PIXELFORMATDESCRIPTOR
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor; // данные формата пикселей
nPixelFormat : Integer;
Begin
With pfd do begin
nSize := sizeof (TPixelFormatDescriptor); // размер структуры
nVersion := 1; // номер версии
dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL; // множество битовых флагов, определяющих устройство и интерфейс
iPixelType := PFD_TYPE_RGBA; // режим для изображения цветов
cColorBits := 16; // число битовых плоскостей в каждом буфере цвета
cRedBits := 0; // число битовых плоскостей красного в каждом буфере RGBA
cRedShift := 0; // смещение от начала числа битовых плоскостей красного в каждом буфере RGBA
cGreenBits := 0; // число битовых плоскостей зелёного в каждом буфере RGBA
cGreenShift := 0; // смещение от начала числа битовых плоскостей зелёного в каждом буфере RGBA
cBlueBits := 0; // число битовых плоскостей синего в каждом буфере RGBA
cBlueShift := 0; // смещение от начала числа битовых плоскостей синего в каждом буфере RGBA
cAlphaBits := 0; // число битовых плоскостей альфа в каждом буфере RGBA
cAlphaShift := 0; // смещение от начала числа битовых плоскостей альфа в каждом буфере RGBA
cAccumBits := 0; // общее число битовых плоскостей в буфере аккумулятора
cAccumRedBits := 0; // число битовых плоскостей красного в буфере аккумулятора
cAccumGreenBits := 0; // число битовых плоскостей зелёного в буфере аккумулятора
cAccumBlueBits := 0; // число битовых плоскостей синего в буфере аккумулятора
cAccumAlphaBits := 0; // число битовых плоскостей альфа в буфере аккумулятора
cDepthBits := 32; // размер буфера глубины (ось z)
c...